import string,random,os
#               画布     画笔      字体         模糊
from PIL import Image,ImageDraw,ImageFont,ImageFilter
#
class VerifyUtil:
    #                  图宽      图高       验证码个数   字体大小
    def __init__(self,width=140,height=40,length=4,size = 20):
        self.width = width
        self.height = height
        self.length = length
        self.size = size

    #验证码生产方法
    def random_str(self):
        """
        :return:  验证码  ==》 str
        """
        res = string.ascii_letters + string.digits
        #生成4个数字
        return "".join(random.choices(res,k = self.length))

    #颜色方法
    #使用rgb rgb(0,0,0) - rgb(255,255,255)
    def random_color(self):
        li = [random.randint(0,255) for _ in range(3)]
        return tuple(li)

    #干扰线
    def random_lines(self,draw):
        """
        画线（x,y） (x,y)  ==>x:0:140  y:0:40
        :param draw: 画笔
        :return: None
        """
        for i in range(6):
            lines = [(random.randint(0,140),random.randint(0,40)) for _ in range(2)]
            # 画线   [(x,y),(x,y)] , 颜色 , 线条粗细
            draw.line(lines,fill=self.random_color(),width=2)

    #干扰点
    def randow_points(self,draw):
        """
        画点
        :param draw: 画笔
        :return:  None
        """
        for i in range(self.width):  # 获取行
            for j in range(self.height):  # 获取列
                # 随机数字 来控制干扰点的比例
                if random.randint(0, 100) <= 10:  # 10%
                    draw.point((i, j), fill=self.random_color())

    #综合方法
    def verify_code(self):
        '''

        :return: 图片信息   验证码信息
        '''
        # 生成画布
        image = Image.new('RGB', (self.width, self.height), (255, 255, 255))

        # 字体文件 dirname() 获取文件夹  abspath()获取绝对路径
        file = os.path.dirname(os.path.abspath(__file__))  # /home/bd/djangodemo/jutong32/jt32/utils
        font = ImageFont.truetype(f"{file}/HYYakuHei-85W.ttf", self.size)
        # 生成画笔
        draw = ImageDraw.Draw(image)
        # 验证码 干扰线 颜色 干扰点
        self.random_lines(draw)
        self.randow_points(draw)
        code = self.random_str()
        # 验证码填入画布  x轴要发生偏移量的变化
        # (0,5) (35,5),(35+35,5),(35+35+35,5)
        for i in range(self.length):
            # text(（x,y）,验证码内容 ，字体，颜色)
            draw.text((i * 35, 5), code[i], font=font, fill=self.random_color())

        # 可以加也可以不加  BLUR 高斯模糊
        # image = image.filter(ImageFilter.BLUR)
        return image, code



# if __name__ == '__main__':
#     imgverifyUtil = verifyUtil()
#     img,code = imgverifyUtil.verify_code()
#     with open("test.jpg", "wb") as f:
#         img.save(f)
#     print(code)